// 跨标签页通信

/**
 * 消息类型枚举
 */
export enum ChannelMsgType {
  /** 增加员工 */
  'add-emp',
  /** 修改员工 */
  'update-emp'
}

// 创建一个名为'sync-msg'的广播通道
const channel = new BroadcastChannel('sync-msg')

/**
 * 发送消息的函数，接收消息类型和消息内容作为参数;
 * 发送的消息类型不能是响应式的，注意，注意，注意
 * @param type 消息类型
 * @param msg 消息内容，可以是文本、对象、数组、数值等
 */
export function sendMsg(type: ChannelMsgType, msg: any) {
  // 将消息类型和消息内容作为对象发送
  channel.postMessage({ type, msg })
}

/**
 * 监听消息的函数，接收一个回调函数作为参数
 * @param callback 接收消息的回调函数
 * @returns
 */
export function listenMsg(callback: (...args: any[]) => void) {
  // 定义一个处理函数，接收事件对象作为参数
  const handler = (e: any) => {
    // 如果回调函数存在，则调用回调函数，并将事件对象的数据作为参数传入
    callback && callback(e.data)
  }
  // 监听消息事件，当有消息发送时，调用处理函数
  channel.addEventListener('message', handler)
  // 返回一个函数，用于移除消息事件的监听
  return () => {
    channel.removeEventListener('message', handler)
  }
}
